🎖️GitЯра🎖️
src/Identity.cpp HEAD (0679dbef) Text, 5.42 KB
Tff7b72#Tff7b72include T8b949e"Identity.h"
Tff7b72#Tff7b72include T8b949e<string.h>
Tff7b72#Tff7b72define ED25519_NO_SEED 1
Tff7b72#Tff7b72include T8b949e<ed_25519.h>
Tff7b72#Tff7b72include T8b949e<Ed25519.h>
Tff7b72#Tff7b72ifdef USE_CC310_HW_CRYPTO
Tff7b72#Tff7b72include T8b949e<Adafruit_nRFCrypto.h>
Tff7b72#Tff7b72include T8b949e"nrf_cc310/include/crys_ec_edw_api.h"
Tff7b72#Tff7b72endif
Tff7b72namespace T7ee787mesh Tb4b4b4{
Te6edf3IdentityTff7b72:Tff7b72:Te6edf3IdentityTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3memsetTb4b4b4(Te6edf3pub_keyTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3pub_keyTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3IdentityTff7b72:Tff7b72:Te6edf3IdentityTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3pub_hexTb4b4b4) Tb4b4b4{
Te6edf3UtilsTff7b72:Tff7b72:Te6edf3fromHexTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4, Te6edf3pub_hexTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3IdentityTff7b72:Tff7b72:Te6edf3verifyTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3sigTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3messageTb4b4b4, Tffa657int Te6edf3msg_lenTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72#Tff7b72ifdef USE_CC310_HW_CRYPTO
T8b949e// nRF52840 CryptoCell CC310 hardware Ed25519 verification. The software
T8b949e// implementations need ~3KB of stack (which can overflow the Adafruit core's
T8b949e// 4KB loop task stack from the advert receive path); the hardware path
T8b949e// needs much less, around 600-700bytes. The CC310 workspace is static, faster,
T8b949e// should save power at scale as well.
Tff7b72static Te6edf3CRYS_ECEDW_TempBuff_t Te6edf3cc310_tmpTb4b4b4;
Te6edf3CRYSError_t Te6edf3rc Tff7b72= Te6edf3CRYS_ECEDW_VerifyTb4b4b4(Tb4b4b4(Tffa657uint8_tTff7b72*Tb4b4b4)Te6edf3sigTb4b4b4, Te6edf3CRYS_ECEDW_SIGNATURE_BYTESTb4b4b4,
Tb4b4b4(Tffa657uint8_tTff7b72*Tb4b4b4)Te6edf3pub_keyTb4b4b4, Te6edf3CRYS_ECEDW_MOD_SIZE_IN_BYTESTb4b4b4,
Tb4b4b4(Tffa657uint8_tTff7b72*Tb4b4b4)Te6edf3messageTb4b4b4, Tb4b4b4(Tffa657size_tTb4b4b4)Te6edf3msg_lenTb4b4b4, Tff7b72&Te6edf3cc310_tmpTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3rc Tff7b72=Tff7b72= Te6edf3CRYS_OKTb4b4b4;
Tff7b72#Tff7b72elif 0
T8b949e// NOTE: memory corruption bug was found in this function!!
Tff7b72return Te6edf3ed25519_verifyTb4b4b4(Te6edf3sigTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3msg_lenTb4b4b4, Te6edf3pub_keyTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72return Te6edf3Ed25519Tff7b72:Tff7b72:Te6edf3verifyTb4b4b4(Te6edf3sigTb4b4b4, Tff7b72thisTff7b72-Tff7b72>Te6edf3pub_keyTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3msg_lenTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tffa657bool Te6edf3IdentityTff7b72:Tff7b72:Te6edf3readFromTb4b4b4(Te6edf3StreamTff7b72& Te6edf3sTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3IdentityTff7b72:Tff7b72:Te6edf3writeToTb4b4b4(Te6edf3StreamTff7b72& Te6edf3sTb4b4b4) Tff7b72const Tb4b4b4{
Tff7b72return Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3IdentityTff7b72:Tff7b72:Te6edf3printToTb4b4b4(Te6edf3StreamTff7b72& Te6edf3sTb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3UtilsTff7b72:Tff7b72:Te6edf3printHexTb4b4b4(Te6edf3sTb4b4b4, Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3LocalIdentityTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3memsetTb4b4b4(Te6edf3prv_keyTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3prv_keyTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3LocalIdentityTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3prv_hexTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3pub_hexTb4b4b4) Tff7b72: Te6edf3IdentityTb4b4b4(Te6edf3pub_hexTb4b4b4) Tb4b4b4{
Te6edf3UtilsTff7b72:Tff7b72:Te6edf3fromHexTb4b4b4(Te6edf3prv_keyTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4, Te6edf3prv_hexTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3LocalIdentityTb4b4b4(Te6edf3RNGTff7b72* Te6edf3rngTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3seedTb4b4b4[Te6edf3SEED_SIZETb4b4b4]Tb4b4b4;
Te6edf3rngTff7b72-Tff7b72>Te6edf3randomTb4b4b4(Te6edf3seedTb4b4b4, Te6edf3SEED_SIZETb4b4b4)Tb4b4b4;
Te6edf3ed25519_create_keypairTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3prv_keyTb4b4b4, Te6edf3seedTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3validatePrivateKeyTb4b4b4(Tff7b72const Tffa657uint8_t Te6edf3prvTb4b4b4[T79c0ff64Tb4b4b4]Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3pubTb4b4b4[T79c0ff32Tb4b4b4]Tb4b4b4;
Te6edf3ed25519_derive_pubTb4b4b4(Te6edf3pubTb4b4b4, Te6edf3prvTb4b4b4)Tb4b4b4; T8b949e// derive public key from given private key
T8b949e// disallow 00 or FF prefixed public keys
Tff7b72if Tb4b4b4(Te6edf3pubTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=Tff7b72= T79c0ff0x00 Tff7b72|Tff7b72| Te6edf3pubTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4) Tff7b72return Tffa657falseTb4b4b4;
T8b949e// known good test client keypair
Tff7b72const Tffa657uint8_t Te6edf3test_client_prvTb4b4b4[T79c0ff64Tb4b4b4] Tff7b72= Tb4b4b4{
T79c0ff0x70Tb4b4b4, T79c0ff0x65Tb4b4b4, T79c0ff0xe1Tb4b4b4, T79c0ff0x8fTb4b4b4, T79c0ff0xd9Tb4b4b4, T79c0ff0xfaTb4b4b4, T79c0ff0xbbTb4b4b4, T79c0ff0x70Tb4b4b4,
T79c0ff0xc1Tb4b4b4, T79c0ff0xedTb4b4b4, T79c0ff0x90Tb4b4b4, T79c0ff0xdcTb4b4b4, T79c0ff0xa1Tb4b4b4, T79c0ff0x99Tb4b4b4, T79c0ff0x07Tb4b4b4, T79c0ff0xdeTb4b4b4,
T79c0ff0x69Tb4b4b4, T79c0ff0x8cTb4b4b4, T79c0ff0x88Tb4b4b4, T79c0ff0xb7Tb4b4b4, T79c0ff0x09Tb4b4b4, T79c0ff0xeaTb4b4b4, T79c0ff0x14Tb4b4b4, T79c0ff0x6eTb4b4b4,
T79c0ff0xafTb4b4b4, T79c0ff0xd9Tb4b4b4, T79c0ff0x3dTb4b4b4, T79c0ff0x9bTb4b4b4, T79c0ff0x83Tb4b4b4, T79c0ff0x0cTb4b4b4, T79c0ff0x7bTb4b4b4, T79c0ff0x60Tb4b4b4,
T79c0ff0xc4Tb4b4b4, T79c0ff0x68Tb4b4b4, T79c0ff0x11Tb4b4b4, T79c0ff0x93Tb4b4b4, T79c0ff0xc7Tb4b4b4, T79c0ff0x9bTb4b4b4, T79c0ff0xbcTb4b4b4, T79c0ff0x39Tb4b4b4,
T79c0ff0x94Tb4b4b4, T79c0ff0x5bTb4b4b4, T79c0ff0xa8Tb4b4b4, T79c0ff0x06Tb4b4b4, T79c0ff0x41Tb4b4b4, T79c0ff0x04Tb4b4b4, T79c0ff0xbbTb4b4b4, T79c0ff0x61Tb4b4b4,
T79c0ff0x8fTb4b4b4, T79c0ff0x8fTb4b4b4, T79c0ff0xd7Tb4b4b4, T79c0ff0xa8Tb4b4b4, T79c0ff0x4aTb4b4b4, T79c0ff0x0aTb4b4b4, T79c0ff0xf6Tb4b4b4, T79c0ff0xf5Tb4b4b4,
T79c0ff0x70Tb4b4b4, T79c0ff0x33Tb4b4b4, T79c0ff0xd6Tb4b4b4, T79c0ff0xe8Tb4b4b4, T79c0ff0xddTb4b4b4, T79c0ff0xcdTb4b4b4, T79c0ff0x64Tb4b4b4, T79c0ff0x71
Tb4b4b4}Tb4b4b4;
Tff7b72const Tffa657uint8_t Te6edf3test_client_pubTb4b4b4[T79c0ff32Tb4b4b4] Tff7b72= Tb4b4b4{
T79c0ff0x1eTb4b4b4, T79c0ff0xc7Tb4b4b4, T79c0ff0x71Tb4b4b4, T79c0ff0x75Tb4b4b4, T79c0ff0xb0Tb4b4b4, T79c0ff0x91Tb4b4b4, T79c0ff0x8eTb4b4b4, T79c0ff0xd2Tb4b4b4,
T79c0ff0x06Tb4b4b4, T79c0ff0xf9Tb4b4b4, T79c0ff0xaeTb4b4b4, T79c0ff0x04Tb4b4b4, T79c0ff0xecTb4b4b4, T79c0ff0x13Tb4b4b4, T79c0ff0x6dTb4b4b4, T79c0ff0x6dTb4b4b4,
T79c0ff0x5dTb4b4b4, T79c0ff0x43Tb4b4b4, T79c0ff0x15Tb4b4b4, T79c0ff0xbbTb4b4b4, T79c0ff0x26Tb4b4b4, T79c0ff0x30Tb4b4b4, T79c0ff0x54Tb4b4b4, T79c0ff0x27Tb4b4b4,
T79c0ff0xf6Tb4b4b4, T79c0ff0x45Tb4b4b4, T79c0ff0xb4Tb4b4b4, T79c0ff0x92Tb4b4b4, T79c0ff0xe9Tb4b4b4, T79c0ff0x35Tb4b4b4, T79c0ff0x0cTb4b4b4, T79c0ff0x10
Tb4b4b4}Tb4b4b4;
Tffa657uint8_t Te6edf3ss1Tb4b4b4[T79c0ff32Tb4b4b4]Tb4b4b4, Te6edf3ss2Tb4b4b4[T79c0ff32Tb4b4b4]Tb4b4b4;
T8b949e// shared secret we calculte from test client pubkey and given private key
Te6edf3ed25519_key_exchangeTb4b4b4(Te6edf3ss1Tb4b4b4, Te6edf3test_client_pubTb4b4b4, Te6edf3prvTb4b4b4)Tb4b4b4;
T8b949e// shared secret they calculate from our derived public key and test client private key
Te6edf3ed25519_key_exchangeTb4b4b4(Te6edf3ss2Tb4b4b4, Te6edf3pubTb4b4b4, Te6edf3test_client_prvTb4b4b4)Tb4b4b4;
T8b949e// check that both shared secrets match
Tff7b72if Tb4b4b4(Te6edf3memcmpTb4b4b4(Te6edf3ss1Tb4b4b4, Te6edf3ss2Tb4b4b4, T79c0ff32Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return Tffa657falseTb4b4b4;
T8b949e// reject all-zero shared secret
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff32Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3ss1Tb4b4b4[Te6edf3iTb4b4b4] Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3readFromTb4b4b4(Te6edf3StreamTff7b72& Te6edf3sTb4b4b4) Tb4b4b4{
Tffa657bool Te6edf3success Tff7b72= Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3readBytesTb4b4b4(Te6edf3prv_keyTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3successTb4b4b4;
Tb4b4b4}
Tffa657bool Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3writeToTb4b4b4(Te6edf3StreamTff7b72& Te6edf3sTb4b4b4) Tff7b72const Tb4b4b4{
Tffa657bool Te6edf3success Tff7b72= Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Te6edf3success Tff7b72= Te6edf3success Tff7b72&Tff7b72& Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3prv_keyTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4) Tff7b72=Tff7b72= Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3successTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3printToTb4b4b4(Te6edf3StreamTff7b72& Te6edf3sTb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3sTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ffpub_key: Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3UtilsTff7b72:Tff7b72:Te6edf3printHexTb4b4b4(Te6edf3sTb4b4b4, Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3sTb4b4b4.Te6edf3printlnTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ffprv_key: Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3UtilsTff7b72:Tff7b72:Te6edf3printHexTb4b4b4(Te6edf3sTb4b4b4, Te6edf3prv_keyTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3sTb4b4b4.Te6edf3printlnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657size_t Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3writeToTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3destTb4b4b4, Tffa657size_t Te6edf3max_lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3max_len Tff7b72< Te6edf3PRV_KEY_SIZETb4b4b4) Tff7b72return T79c0ff0Tb4b4b4; T8b949e// not big enough
Tff7b72if Tb4b4b4(Te6edf3max_len Tff7b72< Te6edf3PRV_KEY_SIZE Tff7b72+ Te6edf3PUB_KEY_SIZETb4b4b4) Tb4b4b4{ T8b949e// only room for prv_key
Te6edf3memcpyTb4b4b4(Te6edf3destTb4b4b4, Te6edf3prv_keyTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3PRV_KEY_SIZETb4b4b4;
Tb4b4b4}
Te6edf3memcpyTb4b4b4(Te6edf3destTb4b4b4, Te6edf3prv_keyTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4; T8b949e// otherwise can fit prv + pub keys
Te6edf3memcpyTb4b4b4(Tff7b72&Te6edf3destTb4b4b4[Te6edf3PRV_KEY_SIZETb4b4b4]Tb4b4b4, Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3PRV_KEY_SIZE Tff7b72+ Te6edf3PUB_KEY_SIZETb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3readFromTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3srcTb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72=Tff7b72= Te6edf3PRV_KEY_SIZE Tff7b72+ Te6edf3PUB_KEY_SIZETb4b4b4) Tb4b4b4{ T8b949e// has prv + pub keys
Te6edf3memcpyTb4b4b4(Te6edf3prv_keyTb4b4b4, Te6edf3srcTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3pub_keyTb4b4b4, Tff7b72&Te6edf3srcTb4b4b4[Te6edf3PRV_KEY_SIZETb4b4b4]Tb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3len Tff7b72=Tff7b72= Te6edf3PRV_KEY_SIZETb4b4b4) Tb4b4b4{
Te6edf3memcpyTb4b4b4(Te6edf3prv_keyTb4b4b4, Te6edf3srcTb4b4b4, Te6edf3PRV_KEY_SIZETb4b4b4)Tb4b4b4;
T8b949e// now need to re-calculate the pub_key
Te6edf3ed25519_derive_pubTb4b4b4(Te6edf3pub_keyTb4b4b4, Te6edf3prv_keyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657void Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3signTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3sigTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3messageTb4b4b4, Tffa657int Te6edf3msg_lenTb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3ed25519_signTb4b4b4(Te6edf3sigTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3msg_lenTb4b4b4, Te6edf3pub_keyTb4b4b4, Te6edf3prv_keyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3LocalIdentityTff7b72:Tff7b72:Te6edf3calcSharedSecretTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3other_pub_keyTb4b4b4) Tff7b72const Tb4b4b4{
Te6edf3ed25519_key_exchangeTb4b4b4(Te6edf3secretTb4b4b4, Te6edf3other_pub_keyTb4b4b4, Te6edf3prv_keyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.1s